#include "stdio.h"
#include <string.h>
typedef void (*func)(void *);
typedef struct fsm_table_t
{

    int cur_status;   //当前状态
    int next_status;  //触发后进入的下一状态
    int event;        //事件
    func eventfunc;   //执行动作

} fsm_table_t;



#define MAX_FSM_TABLE_SIZE  (10)
//系统状态结构
typedef struct fsm_t
{
    int system_status;   //当前系统状态
    int system_valid_item_len;    //有效子项个数
    fsm_table_t fsm_table[MAX_FSM_TABLE_SIZE];   //状态机子项链表

} fsm_t;


int FsmEventHandler(fsm_t *fsm, int event,void *data)
{
    int i = 0;
    for(i = 0; i < fsm->system_valid_item_len; i++)
    {
        //查找与当前系统状态一样并且触发事件也相同的子状态项
        if(fsm->fsm_table[i].cur_status == fsm->system_status &&fsm->fsm_table[i].event == event)
        {
            fsm->fsm_table[i].eventfunc(data);
            //系统状态改变
            fsm->system_status = fsm->fsm_table[i].next_status;
            return 0;
        }


    }
}

int AddItemToFsm(fsm_t *fsm, int cur_status, int next_status, int event, func eventfunc)
{
    //入参判断
    if(fsm->system_valid_item_len >= MAX_FSM_TABLE_SIZE || eventfunc == NULL)
        return - 1;
    //赋值
    fsm->fsm_table[fsm->system_valid_item_len].cur_status = cur_status;
    fsm->fsm_table[fsm->system_valid_item_len].next_status = next_status;
    fsm->fsm_table[fsm->system_valid_item_len].event = event;
    fsm->fsm_table[fsm->system_valid_item_len].eventfunc = eventfunc;
    fsm->system_valid_item_len++;
    return 0 ;
}
void func1(void *in)
{
    printf("event 1\r\n");
}
void func2(void *in)
{
    printf("event 2\r\n");
}
void func3(void *in)
{
    printf("event 3\r\n");
}

fsm_t test_fsm;

int main()
{
    memset(&test_fsm, 0, sizeof(test_fsm));
    test_fsm.system_status = 1;//初始化系统状态
    AddItemToFsm(&test_fsm, 1, 2, 10, func1);
    AddItemToFsm(&test_fsm, 2, 3, 11, func2);
    AddItemToFsm(&test_fsm, 3, 1, 12, func3);
    while(1)
    {
        //触发事件10
        FsmEventHandler(&test_fsm, 10, NULL);
        //触发事件11
        FsmEventHandler(&test_fsm, 11, NULL);
        //触发事件12
        FsmEventHandler(&test_fsm, 12, NULL);
    }

}


